package AlgoritmosGeneticos.model.impl;

import AlgoritmosGeneticos.model.Individuo;
import AlgoritmosGeneticos.model.OperadorMutacion;


public class IndividuoImpl implements Individuo{
	
	private static final int DECIMALES_INDIVIDUO = 14;

	private String numeroBinario;
	private double decimal;
	private int entero;
	private double pMut;
	

	public IndividuoImpl(String binario, double pMut){
		this.numeroBinario = binario;
		this.pMut=pMut;
	}

	
	

	public double toNumber(){
		double respuesta;
		String parteEntera = numeroBinario.substring(0,2);
		String parteDecimal = numeroBinario.substring(2, DECIMALES_INDIVIDUO + 2);
		this.entero = Integer.parseInt(parteEntera, 2);
		this.decimal = Integer.parseInt(parteDecimal, 2) / 16384.0;
		respuesta = entero + decimal;
		return respuesta;
	}
	
	@Override
	public void mutar(OperadorMutacion opMut) {
		IndividuoImpl i = (IndividuoImpl) opMut.mutar(this);
		this.numeroBinario = i.numeroBinario;
	}
	
	
	@Override
	public int compareTo(Individuo ind) {
		if(PoblacionImpl.aptitud(this) > PoblacionImpl.aptitud(ind))
            return -1;
        else if(PoblacionImpl.aptitud(this) == PoblacionImpl.aptitud(ind))
            return 0;
        else
            return 1;
	}

	public void setpMut(double pMut) {
		this.pMut = pMut;
	}

	public double getpMut() {
		return pMut;
	}

	public boolean equals(Object o){
		IndividuoImpl individuo = (IndividuoImpl)o;
		return this.numeroBinario.equals(individuo.numeroBinario);
	}

	@Override
	public int hashCode() {
		return numeroBinario.hashCode();
	}
	
	public int length() {
		return numeroBinario.length();
	}
	
	@Override
	public String toString(){
		Double numero = this.toNumber();
		return numero.toString();
	}

		@Override
	public String getNumenoBinario() {
		return numeroBinario;
	}
/*
	@Override
	public boolean isValid(){
		
		return decimal < 1000;
	}
	*/


		
}
